package org.dromara.easytl.ast;

/**
 * 成员访问节点
 * 表示对象的属性或字段访问，例如：user.name
 * 支持普通访问（.）和空安全访问（?.）
 * 
 * @author EasyTL Team
 */
public class MemberAccess extends ASTNode {
    
    /** 对象表达式 */
    private final ASTNode object;
    
    /** 成员名称 */
    private final String memberName;
    
    /** 是否为空安全访问（?.） */
    private final boolean safeNavigation;
    
    /**
     * 构造成员访问节点
     * 
     * @param object 对象表达式
     * @param memberName 成员名称
     * @param safeNavigation 是否为空安全访问
     */
    public MemberAccess(ASTNode object, String memberName, boolean safeNavigation) {
        this.object = object;
        this.memberName = memberName;
        this.safeNavigation = safeNavigation;
    }
    
    /**
     * 获取对象表达式
     * 
     * @return 对象表达式
     */
    public ASTNode getObject() {
        return object;
    }
    
    /**
     * 获取成员名称
     * 
     * @return 成员名称
     */
    public String getMemberName() {
        return memberName;
    }
    
    /**
     * 是否为空安全访问
     * 
     * @return 如果是空安全访问返回true
     */
    public boolean isSafeNavigation() {
        return safeNavigation;
    }
    
    @Override
    public <T> T accept(ASTVisitor<T> visitor) {
        return visitor.visitMemberAccess(this);
    }
    
    @Override
    public String toString() {
        return "MemberAccess{" +
                "object=" + object +
                ", memberName='" + memberName + '\'' +
                ", safeNavigation=" + safeNavigation +
                '}';
    }
}

